home *** CD-ROM | disk | FTP | other *** search
- ;-----------------------------------------------------------
- ; PATROL.TXT
- ;-----------------------------------------------------------
- ; This tank will pick an (x,y) location, and move to it, as
- ; quickly as possable. Once there, it will show a little
- ; fireworks display.
- ;-----------------------------------------------------------
- ; There are quicker ways to write this, this is just one of
- ; many available.
- ;
- ; The tank uses AUTOmatic tank movement (which is fast, but
- ; not accurate) to get in the general area of the destination.
- ; Once there it uses the MOVE command for exact placement, if
- ; that is possible (IE: the destination is not covered
- ; by an unmovable object like a tree).
- ; If the tank gets caught on an unmovable object, it will pick
- ; a new location.
- ;-----------------------------------------------------------
- ; This program shows some advanced tank programming stratagies, so
- ; examine it closely, and modify it freely!
- ; - Sandy Walsh, May 16/89
- ;-----------------------------------------------------------
-
-
- ;---------------------
- ; Variable definitions
- ;---------------------
-
- make x ; This is the destination X location
- make y ; and the destination Y location
- make d ; Direction required to reach X,Y
- make look ; Response from the scan command. Used to check
- ; if there is an enemy tank in the direction the
- ; tank is currently looking.
- make bump ; Counter for how many times we hit an unmoveable object
- make count ; Number of move-loops count
- make scrap ; Junk variable for simple loops, etc
-
- ;---------------------
- ; Start of program
- ;---------------------
-
- select 3 ; Select the Cannon as a weapon
-
- :align ; Make the Tank and the Turrent face the same direction
- aim ctdir
- jneq ctdir,cgdir,:align
- lock 1 ; Now that they face the same way, lock them together
-
- :loop ; ->>>- Main Loop ->>>+
- ; |
- rand x,100 ; Pick a Destination |
- rand y,70 ; V
- ; V
- call :getthere ; Call subroutine |
- ; |
- call :display ; WE'RE HERE! |
- ; Make a display!! |
- goto :loop ; --------<<<---------+
-
- ;---------------------
- ; End of Main program
- ;---------------------
-
- ;-------------------------------------
- :getthere
- ;-------------------------------------
- ; Move Tank currently at (whereX, whereY) to (X,Y)
- ;-------------------------------------
- set count,0 ; Reset the loop counter
-
- :loop2
- auto 0 ; Start the tank moving automatically
- jeq x,wherex,:check ; Does the X axis match up?? If so go to :check
- :nope
- auto 1
-
- conv x,y,d ; Convert the destination to a direction from 1-8
-
- jeq ctdir,d,:skip1 ; If we don't have to change from our current direction
- ; Go to :skip1
- auto 0
- face d
-
- add count,1 ; Increase the loop counter by 1
- jgt count,8,:FineMove ; If we have to turn more than 3 times (Which we shouldn't!)
- ; Go to the "Fine Movement" routine
- :skip1
- auto 0
- jeq blockage,1,:Check_Object ; If we are blocked by an unmoveable object. Check it out
- auto 1
- set bump,0 ; Otherwise, Reset Bump to zero
-
- goto :loop2 ; Keep moving towards destination
-
- ;---------------------------------------------------------------
-
- :check
- jneq y,wherey,:nope ; Does the y-axis also match? If not, go back to loop
- ; If yes ...
- :goback
- return ; Go back to calling function
-
- :Check_Object
- add bump,1 ; increase the number of times we hit an
- ; unmovable object in a row.
-
- jlt bump,10,:loop2 ; If not 10 times, go back to movement loop
- goto :goback ; If we hit the object 10 times, go somewhere else.
-
- ;----------------------------------------------------------------
- :FineMove
- ;-------------------------------------
- ; Move Tank currently at (whereX, whereY) to (X,Y), using fine movement
- ;-------------------------------------
-
- auto 0 ; Automatic tank movement is ALWAYS OFF in fine move
-
- :loop3
- jeq x,wherex,:check1 ; Does the X axis match up?? If so go to :check1
- :nope1
-
- conv x,y,d ; Convert the destination to a direction from 1-8
- face d ; Desired direction (d)
- move ; Move a single step in the desired direction.
-
- jeq blockage,1,:Check_Object1 ; If we are blocked by an unmoveable object. Check it out
- set bump,0 ; Otherwise, Reset Bump to zero
-
- goto :loop3 ; Keep moving towards destination
-
- ;---------------------------------------------------------------
-
- :check1
- jneq y,wherey,:nope1 ; Does the y-axis also match? If not, go back to loop
- ; If yes ...
- goto :goback
-
- :Check_Object1
- add bump,1 ; increase the number of times we hit an
- ; unmovable object in a row.
-
- jlt bump,10,:loop3 ; If not 10 times, go back to movement loop
- goto :goback ; If we hit the object 10 times, go somewhere else.
-
- ;----------------------------------------------
- :Display
- ;----------------------------------------------
- ; This routine simply spins the tank around and shoots all over the place.
- ; It is used to show that we have reached our destination.
- ; It could, however, do something useful like:
- ; - Radio other tanks of the location
- ; - Sit for a little while, and track other tanks
- ; - Plant mines
- ; - Or all of the above!!
- ;----------------------------------------------
-
- set scrap,0
-
- :dispLoop
-
- fire ; Fire cannon
- right ; Spin clockwise
- add scrap,1 ; Increment counter
-
- jlt scrap,8,:dispLoop ; Turn 8 times
- return ; Go back and do it again!
-
- ;-----------------------
- ; End of PATROL.TXT
- ;-----------------------